import axios from 'axios';

const CancelToken = axios.CancelToken;
const promiseArr = {};
let cancel;

const instance = axios.create({
	timeout: 10000,
	baseURL: '/shop',
	headers: {
		'X-Requested-With': 'XMLHttpRequest',
	},
});

// 请求拦截器
instance.interceptors.request.use(
	(config) => {
		// 发起请求时，取消掉当前正在进行的相同请求
		if (promiseArr[config.url]) {
			promiseArr[config.url]('操作取消');
			promiseArr[config.url] = cancel;
		} else {
			promiseArr[config.url] = cancel;
		}
		return config;
	},
	(error) => {
		return Promise.reject(error);
	}
);

//响应拦截器即异常处理
instance.interceptors.response.use(
	(response) => {
		return response.data;
	},
	(err) => {
		if (err && err.response) {
			switch (err.response.status) {
				case 400:
					err.message = '错误请求';
					break;
				case 401:
					err.message = '未授权，请重新登录';
					break;
				case 403:
					err.message = '拒绝访问';
					break;
				case 404:
					err.message = '请求错误,未找到该资源';
					break;
				case 405:
					err.message = '请求方法未允许';
					break;
				case 408:
					err.message = '请求超时';
					break;
				case 500:
					err.message = '服务器端出错';
					break;
				case 501:
					err.message = '网络未实现';
					break;
				case 502:
					err.message = '网络错误';
					break;
				case 503:
					err.message = '服务不可用';
					break;
				case 504:
					err.message = '网络超时';
					break;
				case 505:
					err.message = 'http版本不支持该请求';
					break;
				default:
					err.message = `连接错误${err.response.status}`;
			}
		} else {
			err.message = '连接到服务器失败';
		}
		return Promise.reject(err.response);
	}
);

// get请求
export const GET = (data = {}) => {
	return new Promise((resolve, reject) => {
		instance({
			method: 'get',
			url: data.url,
			params: data.params,
			cancelToken: new CancelToken((c) => {
				cancel = c;
			}),
		}).then((res) => {
			resolve(res);
		}, () => { });
	});
};

// post请求
export const POST = (data = {}) => {
	return new Promise((resolve, reject) => {
		instance({
			method: 'post',
			url: data.url,
			data: data.params,
			cancelToken: new CancelToken((c) => {
				cancel = c;
			}),
		}).then((res) => {
			resolve(res);
		}, () => { });
	});
};

// 文件上传请求
export const UPLOAD = (data = {}) => {
	//封装表单数据对象
	var RequestData = new FormData();

	if (JSON.stringify(data.params) != '{}') {
		for (var key in data.params) {
			RequestData.append(key, data.params[key]);
		}
	}

	return new Promise((resolve, reject) => {
		instance({
			method: 'post',
			url: data.url,
			data: RequestData,
			headers: { 'Content-Type': 'multipart/form-data' },
			cancelToken: new CancelToken((c) => {
				cancel = c;
			}),
		}).then((res) => {
			resolve(res);
		}, () => { });
	});
};

const plugin = {
	install(app) {
		// 将axios作为一个全局的变量注册到vue的应用当中
		app.config.globalProperties.$GET = GET;
		app.config.globalProperties.$POST = POST;
		app.config.globalProperties.$UPLOAD = UPLOAD;
	},
}

export default plugin